package class_OuterInner;

/**
 * @author Ajie
 * @date 2022/6/21
 * @function
 * 内部类
 * 是为外部类提供服务的一个类，内部类中可以直接调用外部类的成员。
 * 在外部类中创建 内部类的对象，直接使用内部类就可以了。
 *
 * 匿名内部类
 * new 一个对象，并同时定义了一个子类。
 * 没有明确这个类的名字。简洁。写成匿名内部类的方式 创建对象。
 *
 * 静态内部类
 * 只能访问外部类的静态成员。
 * Outer.Inner in=new Outer.Inner()；//不需要外部类引用
 * 这样实际上使静态内部类成为了一个顶级类。可以定义私有静态内部类。
 * https://baike.baidu.com/item/静态内部类/4785917?fr=aladdin
 *
 * 内部类 访问，控制
 * https://blog.csdn.net/qq_29966203/article/details/90605164
 *
 * 内部类和匿名内部类
 * https://blog.csdn.net/aigo_2021/article/details/122772355
 */
public class OutClass_InnerClass {
    public String puba = "a";
    private String prib  = "b";
    public static String pubStatica = "a";
    private static String priStaticb  = "b";
    private static final String TAG = "OutClass_InnerClass";

    public static void main(String[] args) {
        new OutClass_InnerClass().main();
    }

    public void main() {
        System.out.println("OutClass_InnerClass:main:");
        String a =InnerStaticClass.a;//可以访问。
        String b =InnerStaticClass.b;//可以访问。
        System.out.println("OutClass_InnerClass:main:b:"+b);

        //TODO 匿名内部类
        //省去了单独定义子类
        OutClass_InnerClass outClass_innerClass = new OutClass_InnerClass() {//创建子类的对象
            @Override
            public void eat() {
                System.out.println("子类:eat:");//重写eat方法
            }
        };
        outClass_innerClass.eat();
    }

    //内部类
    class InnerClass{
        private String name = "InnerName";
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }

    public void callInnerInfo(){
        InnerClass innerClass = new InnerClass();
        innerClass.getName();
    }

    //Inner是静态内部类。静态内部类可以访问外部类所有静态变量和方法。
    static class InnerStaticClass{
        public String ipuba = "a";
        private String iprib  = "b";

        public static String a = pubStatica;
        private static String b = priStaticb;
        public void innerMain() {
//            InnerStaticClass.this.main();//访问不了非静态
            staticmain();
        }
    }

    public static void staticmain() {
        System.out.println("OutClass_InnerClass:staticmain:");
    }


    public void eat() {
        System.out.println("Animal eat");
    }
}
